AWS Organizations の組織全体に CloudFormation Guard を利用した Config カスタムルールを展開してみる
AWS Organizations の組織全体に AWS CloudFormation Guard を利用した AWS Config カスタムルールの展開を試してみました。
組織内のアカウントへの Config ルールのデプロイは次のブログで紹介されている機能を利用して AWS CLI で行いました。
試してみた
始めに AWS Organizations の信頼されたアクセスの設定を行ってから、Config ルールの作成と削除を試してみます。
信頼されたアクセスの設定
管理アカウントにおいてconfig-multiaccountsetup.amazonaws.com
の信頼されたアクセスを有効化します。
$ aws organizations enable-aws-service-access --service-principal config-multiaccountsetup.amazonaws.com $ aws organizations list-aws-service-access-for-organization --output text | grep config-multiaccountsetup ENABLEDSERVICEPRINCIPALS 2022-09-28T14:28:59.817000+00:00 config-multiaccountsetup.amazonaws.com
管理アカウントにおいて AWS Config を管理するアカウントに委任する設定を行います。
$ aws organizations register-delegated-administrator --account-id 111122223333 --service-principal config-multiaccountsetup.amazonaws.com $ aws organizations list-delegated-services-for-account --account-id 111122223333 --output text | grep config-multiaccountsetup DELEGATEDSERVICES 2022-09-29T13:56:58.493000+00:00 config-multiaccountsetup.amazonaws.com
Config ルールの作成
作業は委任されたアカウントで作業を行います。委任を行わず、管理アカウントから設定することもできます。
今回は、AWS のブログで紹介されている次のルールを展開してみます。Elastic IP (EIP) がアタッチされており、running
ステータスの EC2 インスタンスを準拠として評価します。
let eipresource = relationships.*[ resourceType == 'AWS::EC2::EIP' ] rule check_ec2_eip_compliance { when %eipresource !empty { configuration.state.name == "running" } }
Config ルールの展開はput-organization-config-rule
コマンドで行います。
put-organization-config-rule — AWS CLI 2.7.35 Command Reference
put-organization-config-rule — AWS CLI 1.25.83 Command Reference
AWS CloudFormation Guard のルールを指定する場合はorganization-custom-policy-rule-metadata
オプションを利用します。今回は次の JSON ファイルを作成してコマンド実行時に指定します。冒頭で紹介したブログでは Shorthand Syntax で実行しています。
{ "Description": "Evaluates if an Amazon EC2 instance has a public Elastic IP attached and running.", "OrganizationConfigRuleTriggerTypes": [ "ConfigurationItemChangeNotification", "OversizedConfigurationItemChangeNotification" ], "ResourceTypesScope": ["AWS::EC2::Instance"], "PolicyRuntime": "guard-2.x.x", "PolicyText": "let eipresource = relationships.*[ resourceType == 'AWS::EC2::EIP' ]\r\nrule check_ec2_eip_compliance { when %eipresource !empty {configuration.state.name == \"running\" } }", "DebugLogDeliveryAccounts": ["111122223333"] }
PolicyText
に AWS CloudFormation Guard のルールを格納しています。改行コードの追加やダブルクオーテーションのエスケープ処理を行っています。
委任先アカウントにおいて、東京リージョンの AWS ClouShell で実行してみます。AWS Cloudshell で実行する場合は上記のmetadata.json
を事前にアップロードしておく必要があります。
$ aws configservice put-organization-config-rule --organization-config-rule-name test-check-ec2-eip --organization-custom-policy-rule-metadata file://metadata.json { "OrganizationConfigRuleArn": "arn:aws:config:ap-northeast-1:111122223333:organization-config-rule/test-check-ec2-eip-7v0fq3id" }
AWS Config のマネジメントコンソールから追加されたカスタムルールを確認してみます。アクションは「再評価」のみ実施できます。ポリシールールを確認することはできないようです。
AWS CLI でも追加されたカスタムルールを確認してみます。マネジメントコンソールと同様にポリシールールであるPolicyText
は確認できないようです。
$ aws configservice describe-config-rules --config-rule-name OrgConfigRule-test-check-ec2-eip-7v0fq3id { "ConfigRules": [ { "ConfigRuleName": "OrgConfigRule-test-check-ec2-eip-7v0fq3id", "ConfigRuleArn": "arn:aws:config:ap-northeast-1:111122223333:config-rule/aws-service-rule/config-multiaccountsetup.amazonaws.com/config-rule-ddbgat", "ConfigRuleId": "config-rule-ddbgat", "Description": "Evaluates if an Amazon EC2 instance has a public Elastic IP attached and running.", "Scope": { "ComplianceResourceTypes": [ "AWS::EC2::Instance" ] }, "Source": { "Owner": "CUSTOM_POLICY", "SourceDetails": [ { "EventSource": "aws.config", "MessageType": "ConfigurationItemChangeNotification" }, { "EventSource": "aws.config", "MessageType": "OversizedConfigurationItemChangeNotification" } ], "CustomPolicyDetails": { "PolicyRuntime": "guard-2.x.x", "PolicyText": "", "EnableDebugLogDelivery": true } }, "ConfigRuleState": "ACTIVE", "CreatedBy": "config-multiaccountsetup.amazonaws.com" } ] }
Config アグリゲータから組織内のアカウントの集約結果を確認します。集約しているアカウントが 2 個の環境とはなりますが、複数アカウントに展開できていることを確認できました。
なお、今回は東京リージョンのみの設定となります。他のリージョンでもルールを展開したい場合は、他のリージョン向けに設定する必要があります。
例えば、バージニア北部リージョンに展開する場合は次のコマンドが展開例となります。
aws configservice put-organization-config-rule \ --organization-config-rule-name test-check-ec2-eip \ --organization-custom-policy-rule-metadata file://metadata.json \ --region us-east-1
Config ルールの削除
最後に、ルールを削除してみます。
削除するコマンドはdelete-organization-config-rule
です。
delete-organization-config-rule — AWS CLI 2.7.35 Command Reference
delete-organization-config-rule — AWS CLI 1.25.83 Command Reference
削除する際に指定するカスタムルール名はルール作成時にorganization-config-rule-name
オプションで指定した値です。OrgConfigRule-
から始まるルール名ではない点に注意が必要です。
$ aws configservice delete-organization-config-rule --organization-config-rule-name test-check-ec2-eip
以上で終わりです。
さいごに
AWS CloudFormation Guard を利用した AWS Config カスタムルールの展開を試してみました。AWS CloudFormation でも試してみたかったのですが、まだ対応していなかったため、またの機会にしたいと思います。
以上、このブログがどなたかのご参考になれば幸いです。